"""
观察者模式模块

该模块实现了观察者设计模式，用于处理PV值变化的通知机制。
主要组件包括：
1. Observer：观察者基类
2. Subject：主题类
3. PVObserver：PV值变化观察者

设计模式说明：
- 观察者模式用于实现对象间的一对多依赖关系
- 当一个对象（主题）状态改变时，所有依赖它的对象（观察者）都会得到通知
- 主题和观察者之间是松耦合的，可以独立变化

使用示例：
    subject = Subject()
    observer = PVObserver(callback_function)
    subject.attach(observer)
    subject.notify(data)
"""

from typing import List, Callable, Any
from abc import ABC, abstractmethod

class Observer(ABC):
    """
    观察者基类
    
    定义了观察者的基本接口，所有具体的观察者类都必须实现update方法。
    
    方法：
        update(): 接收主题通知并处理数据
    """
    
    @abstractmethod
    def update(self, data: Any) -> None:
        """
        更新方法
        
        当主题状态发生变化时，通过此方法通知观察者。
        
        Args:
            data: 主题传递的数据
        """
        pass

class Subject:
    """
    主题类
    
    维护观察者列表，并在状态变化时通知所有观察者。
    
    属性：
        _observers: 观察者列表
    
    方法：
        attach(): 添加观察者
        detach(): 移除观察者
        notify(): 通知所有观察者
    """
    
    def __init__(self):
        """初始化主题，创建空的观察者列表"""
        self._observers: List[Observer] = []
        
    def attach(self, observer: Observer) -> None:
        """
        添加观察者
        
        将观察者添加到观察者列表中。
        
        Args:
            observer: 要添加的观察者对象
        """
        if observer not in self._observers:
            self._observers.append(observer)
            
    def detach(self, observer: Observer) -> None:
        """
        移除观察者
        
        从观察者列表中移除指定的观察者。
        
        Args:
            observer: 要移除的观察者对象
        """
        if observer in self._observers:
            self._observers.remove(observer)
            
    def notify(self, data: Any = None) -> None:
        """
        通知所有观察者
        
        当主题状态发生变化时，通知所有注册的观察者。
        
        Args:
            data: 要传递给观察者的数据
        """
        for observer in self._observers:
            observer.update(data)

class PVObserver(Observer):
    """
    PV观察者类
    
    专门用于处理PV值变化的观察者，通过回调函数处理PV值变化事件。
    
    属性：
        callback: 处理PV值变化的回调函数
    
    方法：
        update(): 调用回调函数处理PV值变化
    """
    
    def __init__(self, callback: Callable[[Any], None]):
        """
        初始化PV观察者
        
        Args:
            callback: 处理PV值变化的回调函数
        """
        self.callback = callback
        
    def update(self, data: Any) -> None:
        """
        调用回调函数
        
        当收到PV值变化通知时，调用回调函数处理数据。
        
        Args:
            data: PV值变化数据，包含PV别名和新的值
        """
        self.callback(data) 